package model;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

//用这个DBUtil来封装连接数据库的操作
public class DBUtil {

    //与数据库建立连接
    private static final String URL="jdbc:mysql://127.0.0.1:3306/BlogSystem?characterEncoding=utf8&useSSL=false";
    private static final String USERNAME="root";
    private static final String PASSWORD="2029889073";

    //dataSoure就是用来与数据库建立连接的
    private static DataSource dataSource=null;

    private static DataSource getDataSource(){
        if(dataSource==null){
            synchronized (DBUtil.class){//在DBUtil运行起来后获取一下dataSource来再次确定其目前状态是否为空。
                //为空再建立数据池
                if(dataSource==null){
                    dataSource=new MysqlDataSource();//
                    ((MysqlDataSource)dataSource).setUrl(URL);//获取到数据库的url
                    ((MysqlDataSource)dataSource).setUser(USERNAME);//获取到数据库的用户名
                    ((MysqlDataSource)dataSource).setPassword(PASSWORD);//获取到数据库的密码
                }
            }
        }
        return dataSource;
    }


//与特定数据库的连接（会话）。在连接上下文中执行 SQL 语句并返回结果。
    public static Connection getConnection(){
        try {
            return (Connection) getDataSource().getConnection();//从数据源中获取数据库sql语句
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }


    //关闭操作
//结果集(ResultSet)是数据中查询结果返回的一种对象，可以说结果集是一个存储查询结果的对象，
// 但是结果集并不仅仅具有存储的功能，他同时还具有操纵数据的功能，可能完成对数据的更新等。

    //使用PreparedStatement:是Statement的子接口,可以传入带占位符的SQL语句，提供了补充占位符变量的方法
    //1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程
    //
    //2.使用 Statement 对象。在对数据库只执行一次性存取的时侯，用 Statement 对象进行处理。PreparedStatement 对象的开销比Statement大，对于一次性操作并不会带来额外的好处。

    public static void close(Connection connection, PreparedStatement statement, ResultSet resultSet){
       try{
           if(resultSet!=null){
               resultSet.close();
           }
           if(connection!=null){
               connection.close();
           }
           if(statement!=null){
               statement.close();
           }
       }catch (SQLException e){
           e.printStackTrace();
       }
    }
}
